package GUI;

import Interface.Entity;
import session.EntitySession;

/**
 * Developed for NTT - All is an Entity
 * Questa classe è la rappresentazione dell'entity di livello GUI
 * @author Alessandro Pollace
 * @version 0.1
 */
public class EntityGUI extends EntitySession implements Entity {

    /***** CONSTRUCTOR *****/
    /**
     * Costruttore per utenti già loggati
     * @param entityName Nome del tipo di entity da caricare
     * @param user Nome utente che richiede l'entity
     * @param group Gruppo dell'utente che richiede l'entity
     * @throws Exception Tipo di entity Non esistente
     */
    public EntityGUI(String entityName, String user, String group) throws Exception {
        super(entityName);
        super.user = user;
        super.group = group;
    }

    /**
     * Costruttore per utenti non loggati
     * @param entityName Nome dell'entity da caricare
     * @throws Exception Tipo di entity Non esistente
     */
    public EntityGUI(String entityName) throws Exception {
        super(entityName);
        super.user = "anonimous";
        super.group = "anonimous";
    }

    /***********************************************/
    /**
     * Set degli attributi che rispecchia i permessi di lettura, quando un utente deve cercare un elemento, è corretto che possa trovare solo quello che ha il permesso di vedere
     * @param AttributeName Nome dell'attributo da settare
     * @param value Valore da settare
     * @throws Exception Attributo non esistente
     */
    public void setAttributeValueForFind(String AttributeName, Object value) throws Exception {
        if (super.isPermitsRead(AttributeName)) {
            super.setAttributeValueSuperMode(AttributeName, value);
        }
    }

    /**
     * Metodo utilizzato per generare l'HTML degli input di un form
     * @param attributeName  Nome dell'attributo
     * @param tot totale di inut daeffettuare nello stesso form
     * @return HTML per l'inserimento
     * @throws Exception Attributo non esistente
     */
    protected String getHTMLforInput(String attributeName, int tot) throws Exception {
        String HTML = null;
        String type, checkFunction;
        String parameter[];
        type = this.getAttributeType(attributeName);
        type = type.trim();
        parameter = type.split(":");


        if (type.equals("String")) {
            type = "text";
        }

        if (type.equals("Number")) {
            type = "text";
        }

        if (type.equals("Decimal")) {
            type = "text";
        }

        if (parameter[0].equals("Password")) {
            type = "password";
        }
        checkFunction = "";
        HTML = "<input name = '" + attributeName + "' type='" + type + "' id='" + attributeName + "' ";
        if (this.getAttributeIsInserible(attributeName).equals("FORCED")) {
            //deve essere inserito in maniera forzata
            checkFunction = "onblur=\"checkInsert(\'" + attributeName + "\',\'" + this.getNome() + "\',\'" + tot + "\',\'yes\');\"";


        }
        if (this.getAttributeIsUnique(attributeName)) {
            //deve essere unico
            if (checkFunction == null) {
                checkFunction = "onblur=\"checkInsert(\'" + attributeName + "\',\'" + this.getNome() + "\',\'" + tot + "\',\'no\');\"";
            }
        }
        HTML = HTML + checkFunction + " />";
        if (parameter[0].equals("Table")) {
        }


        if (parameter[0].equals("List")) {
            String option[] = parameter[1].split(",");
            HTML = "<select name = '" + attributeName + "' >";
            for (int i = 0; i < option.length; i++) {
                if (option[i].equals(parameter[2])) {
                    HTML = HTML + "<option selected='selected'>";
                } else {
                    HTML = HTML + "<option>";
                }
                HTML = HTML + option[i] + "</option>";
            }
            HTML = HTML + "</select>";

        }
        return HTML;
    }

    /**
     * Metodo per ottenere l'HTML per l'inserimento di tutti gli attributi dell'entity istanziata
     * @return HTML
     * @throws Exception Errore nel caricamento della lingua
     */
    public String getHTMLforAllInputForInsert() throws Exception {
        LanguageLoader language = new LanguageLoader();
        String HTML = "";
        if (super.isCreatable()) {
            String name[];
            int tot = 0;
            name = this.getAllNameAttribute();

            for (int i = 0; i < name.length; i++) {
                if (this.getAttributeIsInserible(name[i]).equals("FORCED")) {
                    tot++;
                }
            }

            for (int i = 0; i < name.length; i++) {
                if (!this.getAttributeIsInserible(name[i]).equals("NO")) {
                    HTML = HTML + "<b>" + language.getCaption(this.getNome(), name[i]) + ":</b>";
                    if (this.getAttributeIsInserible(name[i]).equals("FORCED")) {
                        HTML = HTML + "*";
                    }
                    HTML = HTML + "<br />" + this.getHTMLforInput(name[i], tot);
                    HTML = HTML + "<div class='warning' style='display:inline' id='ErrorDiv" + name[i] + "'></div>";
                    HTML = HTML + "<div class='descrizione'>" + language.getDescription(this.getNome(), name[i]) + "</div>";
                }
            }
        } else {
            HTML = language.getSysCaption("NotIsPossibleCreate");
        }
        return HTML;
    }

    /**
     * Questo metodo permette di ottenere il codice HTML per l'inpur di un solo attributo chiamandolo per nome
     * @param AttributeName Nome dell'attributo
     * @return HTML
     * @throws Exception Errore nel caricamento della lingua
     */
    public String getHTMLforOneInputForInsert(String AttributeName) throws Exception {
        LanguageLoader language = new LanguageLoader();
        String HTML = "";
        int tot = 0;
        if (this.getAttributeIsInserible(AttributeName).equals("FORCED")) {
            tot = 1;
        }
        if (super.isPermitsModify(AttributeName)) {
                HTML = HTML + "<b>" + language.getCaption(this.getNome(), AttributeName) + ":</b>";
                if (this.getAttributeIsInserible(AttributeName).equals("FORCED")) {
                    HTML = HTML + "*";
                }
                HTML = HTML + "<br />" + this.getHTMLforInput(AttributeName, tot);
                HTML = HTML + "<div class='warning' style='display:inline' id='ErrorDiv" + AttributeName + "'></div>";
                HTML = HTML + "<div class='descrizione'>" + language.getDescription(this.getNome(), AttributeName) + "</div>";
        } else {
            HTML = language.getSysCaption("NotIsPossibleModify");
        }

        return HTML;
    }
}
